/**
 * 【插件开发规范 - 沙盒适配版本】
 * 1. 插件必须导出一个class，class名称必须与文件名一致。
 * 2. 必须实现 getConfigSchema()、getHandler()、getMeta() 方法。
 *    - getConfigSchema()：返回动态表单schema（form-create风格），用于节点配置面板。
 *    - getHandler()：返回节点执行器对象，必须包含 async run(nodeInstance, context, instanceId, processInstance) 方法。
 *    - getMeta()：返回节点元信息（type、name、icon、desc、portDefs、plusDefs等）。
 * 3. 插件构造函数支持 options 参数，沙盒系统会自动注入所需能力。
 *    - this.httpClient：沙盒注入的 httpClient 实例，可用于发起网络请求。
 *    - this.fs：沙盒注入的 fs 实例，可用于文件读写。
 * 4. handler 的 run 方法建议通过闭包或 bind 保证 this 指向插件实例（如 getHandler() { return { run: this.run.bind(this) } } ）。
 * 5. 如需支持动态注入能力，可实现对应的 set 方法（如 setHttpClient(httpClient)）。
 * 6. 插件开发完成后，建议多测试依赖注入、异常场景，确保 handler 能正常访问注入的能力。
 * 7. 插件应保证兼容沙盒环境，避免全局副作用和不安全的系统调用。
 */

/**
 * 自定义流程节点插件样例 - 沙盒适配版本
 * 必须导出 class，包含 getConfigSchema、getHandler、getMeta 方法
 */

class CustomSampleNodePlugin {
    constructor(options = {}) {
        this.name = 'CustomSampleNodePlugin';
        
        // 从沙盒注入的能力中获取必需功能
        this.httpClient = options.httpClient;
        this.fs = options.fs;
        
        console.log('[CustomSampleNode] 沙盒模式初始化', {
            hasHttpClient: !!this.httpClient,
            hasFS: !!this.fs,
            capabilities: Object.keys(options)
        });
        
        // 验证必需能力（如果插件需要网络访问）
        if (!this.httpClient) {
            console.warn('[CustomSampleNode] httpClient 未注入，网络功能将不可用');
        } else if (typeof this.httpClient.request !== 'function') {
            console.warn('[CustomSampleNode] httpClient 不符合预期接口');
        }
        
        // 验证文件系统能力（如果插件需要文件操作）
        if (!this.fs) {
            console.warn('[CustomSampleNode] fs 未注入，文件操作功能将不可用');
        }
    }

    /**
     * 动态设置HTTP客户端（支持向后兼容）
     */
    setHttpClient(httpClient) {
        if (httpClient && typeof httpClient.request === 'function') {
            this.httpClient = httpClient;
            console.log('[CustomSampleNode] HTTP客户端已更新');
        } else {
            console.warn('[CustomSampleNode] 提供的httpClient无效');
        }
    }
    
    /**
     * 动态设置文件系统能力（支持向后兼容）
     */
    setFileSystem(fs) {
        if (fs && typeof fs.readFileSync === 'function') {
            this.fs = fs;
            console.log('[CustomSampleNode] 文件系统能力已更新');
        } else {
            console.warn('[CustomSampleNode] 提供的fs无效');
        }
    }

    /**
     * 返回动态表单schema（form-create风格）
     */
    getConfigSchema () {
        return [
            {
                type: 'input',
                field: 'title',
                title: '标题',
                value: '',
                props: { placeholder: '请输入标题' },
                validate: [{ required: true, message: '标题必填' }]
            },
            {
                type: 'input',
                field: 'desc',
                title: '描述',
                value: '',
                props: { placeholder: '节点描述' }
            },
            {
                type: 'switch',
                field: 'flag',
                title: '启用标志',
                value: true
            }
        ];
    }

    /**
     * 返回节点执行器（handler）
     */
    getHandler () {
        const self = this;
        return {
            async run (nodeInstance, context, instanceId, processInstance) {
                // 1. 取原始config
                // 查找节点定义
                let nodeDef = undefined;
                if (processInstance && processInstance.definition && Array.isArray(processInstance.definition.nodes)) {
                    nodeDef = processInstance.definition.nodes.find(n => n.id === nodeInstance.nodeId);
                }
                if (!nodeDef) {
                    throw new Error('FileWriteHandler: 未找到节点定义');
                }
                const config = nodeDef.config || {};
                // 3. 日志输出
                console.log('[CustomSampleNode] run', { nodeInstance, context, instanceId, processInstance, config, nodeDef });
                console.log('fs', self.fs);
                console.log('httpClient', self.httpClient);
                // 日志
                if (typeof window !== 'undefined' && window.__agentStore) {
                    window.__agentStore.commit('agent/ADD_LOG', {
                        time: Date.now(),
                        type: 'node-execute',
                        msg: '[CustomSampleNode] 节点进入',
                        extra: { nodeId: nodeInstance.nodeId, instanceId, context }
                    });
                }
                // 状态通知
                if (typeof eventBus !== 'undefined') {
                    eventBus.emit('nodeStatusChange', {
                        nodeInstanceId: nodeInstance.id,
                        status: 'running',
                        instanceId,
                        output: undefined,
                        error: undefined
                    });
                }
                // 业务逻辑：简单拼接
                const result = {
                    message: `标题:${config.title || ''}，描述:${config.desc || ''}，flag:${config.flag}`
                };
                // 状态通知
                if (typeof eventBus !== 'undefined') {
                    eventBus.emit('nodeStatusChange', {
                        nodeInstanceId: nodeInstance.id,
                        status: 'success',
                        instanceId,
                        output: result,
                        error: undefined
                    });
                }
                // 日志
                if (typeof window !== 'undefined' && window.__agentStore) {
                    window.__agentStore.commit('agent/ADD_LOG', {
                        time: Date.now(),
                        type: 'node-execute',
                        msg: '[CustomSampleNode] 节点返回',
                        extra: { nodeId: nodeInstance.nodeId, instanceId, result }
                    });
                }
                return result;
            }
        };
    }

    /**
     * 返回节点元信息
     */
    getMeta () {
        return {
            type: 'custom-sample-node',
            name: '自定义节点样例',
            icon: 'el-icon-star-on',
            desc: '演示自定义节点插件的注册、动态表单与handler',
            portDefs: [
                { key: 'in', type: 'input', side: 'left', offset: { x: 0, y: 32 } },
                { key: 'out', type: 'output', side: 'right', offset: { x: 0, y: 32 } }
            ],
            plusDefs: [
                {
                    key: 'plus-right', side: 'right', show: true, menuList: [
                        { type: 'script', label: '脚本' },
                        { type: 'llm', label: '大模型' },
                        { type: 'custom-sample-node', label: '自定义节点样例' },
                        { type: 'end', label: '结束' }
                    ]
                }
            ]
        };
    }
}

module.exports = CustomSampleNodePlugin;
